docs(agents): PR-body footer rule states channel/action dependence, not a form - #16771
Conversation
…ot a form The edit-side sentence predicted one shape (session-URL survives, the platform appends a bare block) that was measured on a raw REST PATCH and is false on the MCP wrapper: an edit sent with no footer reads back with none (n=4). The create-side sentence is folded into the same clause because the readings on create disagree by channel too, so a rule that names only the edit action would still invite the generalisation that produced a duplicated footer on #16694. The sentence now states the two axes the ledger states — CHANNEL and ACTION — keeps the imperative half, and points at .claude/skills/pm-dispatch/references/platform-readings.md, which is where the per-cell readings belong. The os-dev.md twin is corrected in the same register, in place. Both files keep their line counts (AGENTS.md 1067/1068, os-dev.md 403/403); no reading is restated in either file. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01P58euzUXCVJNwmhuPC9DXY
维护者速读(终稿)席位复核记录:#16633 上的 ACCEPT 评论 5579457475(skills 席,hotlong,session 改了什么两个文件各一句,行数不变。 为什么改这一句四个月改了四次(#12455 → #11273 → #15241 → #15246 → 本卡),每次把一个通道上测到的形态写成无条件规律,换个通道就被推翻;昨晚它第一次造成真实损害 —— 一个席照字面在 REST 通道上 PATCH PR #16694,得到了该文件明令禁止的重复页脚。改成「依赖 + 回读」后这句不再随平台行为腐烂,具体读数留在本来就放读数的账本里。 风险与代价(含回滚)风险小:规则变宽(不再断言具体形态),不会让任何原本合规的写法变违规。代价:读者要多跳一层到账本查自己那一格。棘轮:AGENTS.md 1067/1068、os-dev.md 403/403,席位在分支上复测一致;付账方式是删掉旧的 create 侧子句(它断言的正是 dev 本次实测证伪的那一格),⛔ 未用 re-wrap 充数。回滚 = revert 这一个提交,两句各自恢复,无生成物、无下游依赖。 席位意见同意合并。dev 折叠 create 侧子句进同一句是对的:一句说「取决于建/改」,旁边不能再放一句断言 create 固定结果。19/19 门禁族全绿并对账; 你要做的受管面( 是 Generated by Claude Code |
Fixes #16633
What changed
AGENTS.md's attribution-footer rule stops predicting a form. The PR-body sentences now statethe two axes the ledger states — the CHANNEL (the MCP wrapper vs a raw REST call) and the ACTION
(create vs edit) — say the cells disagree, ban generalising one cell to another, and keep the two
imperatives: send the footer you want stored, read the body back after every write. The
.claude/agents/os-dev.mdtwin (line 401) is corrected in the same register, in place.Kept verbatim: the block-form heading and the two-form fence above it (lines 420-426), and
Durable attribution lives in body prose or a comment.⛔ Untouched: the Issue comment andCommit message sentences in the same paragraph (lines 433-444 are byte-identical).
AGENTS.md428-432create_pull_requestkeeps the session-URL form and rewrites bare into it. On EDIT (update_pull_requestor a REST PATCH, measured in this repository) the session-URL footer survives verbatim and the platform APPENDS a bare footer block under whatever you send — so send an edited body with no footer of your own, read it back, and treat the appended block as the platform's; ⛔ never re-send …references/platform-readings.md. Send the footer you want stored, read the body back after every write, and ⛔ never re-send …os-dev.md401Why the create-side clause folded into the same sentence
The card scopes the edit-side sentence. It is folded because the rewrite's own subject is the
ACTION axis — a sentence that says "it depends on create vs edit" cannot sit beside a sentence
that asserts a fixed outcome for create without contradicting itself, and the create cell is the
one that has already produced a wrong write in this repo (PR #16694's duplicated footer came from
following an edit-side reading on another channel). No separate sentence was added for it: the
old create clause is deleted, not restated, which is also what pays for the new text.
Readings this rests on — recorded on the card and in the ledger, ⛔ none restated in AGENTS.md
update_pull_requestupdate_pull_requestissue_writeby PR numberPATCH /pullsPOST /pullscreate_pull_requestThat last row is what the deleted create clause claimed the opposite of. This PR's own creation is
another sample of that cell; the reading is in the dev report on the card, ⛔ not folded back into
this body by a second write.
Line budget — no growth, paid by deletion
AGENTS.md✓ check-skill-line-ratchet: AGENTS.md is 1067 lines (ceiling 1068; headroom 1)..claude/agents/os-dev.md✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 403 lines (ceiling 403; headroom 0).Widest line written: 96 bytes in
AGENTS.md(cap 120), 119 bytes inos-dev.md(cap 120 — thereplaced line was also 119). ⛔ No re-wrap was counted as payment: lines 433-444 of
AGENTS.mdare byte-identical, so the whole diff is 5 replaced lines plus 1.
Gates — 19 derived, 19 run, all green
Derived in the worktree with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths passed; change set read from the merge base) — identical to the 19 the dispatch named.
Exit codes captured by redirect before any pipe.
check:doc-formula-expressionsfirst exited 3 — PREREQUISITE NOT MET (@objectstack/formulaand
@objectstack/lintnot built): NOT a finding, nothing measured. Afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2under
scripts/pm/os-verify-lock.sh(VERDICT command-exit 0 · held the lock 18s · waited 0s)it re-ran exit 0:
✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 434 files / 1372 TS blocks judged clean by @objectstack/formula.⛔ GOVERNED — a human merge is the review record for this PR (#9495 regime).(exit 3,
AGENTS.md×1 +.claude/**×1). Draft only; no ready flip, no queue, no auto-merge.✓ dispatch-gates --ran: 19 derived famil(ies) accounted for — 19 run, 0 NOT-MEASURED.check:pm-governed-proseandcheck:skill-frame-syncdo not read these two sentences — both green unchanged.Local verification scope — a measured narrowing, not a skipped run
Whole-repo
pnpm lintis CI's. The narrowing is proved, not assumed:filesglobin
eslint.config.mjsis**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}or narrower. Asked directly,eslint answers for both changed paths:
File ignored because no matching configuration was supplied.--format json:pnpm exec eslint AGENTS.md .claude/agents/os-dev.md --no-inline-config --format jsonreturns 2 results,errorCount: 0, and the only messages arethose two ignore notices ⇒ 0 lint-checked files in this diff.
eslint.config.mjsline 328: no
parserOptions.project, no typed@typescript-eslintrules), so amarkdown-only diff cannot move any untouched file's verdict.
No package source changed, so no build closure,
pnpm testortypecheckis owed:dispatch-gatesderives the change set as exactly
AGENTS.md+.claude/agents/os-dev.md, neither inside aworkspace package.
Merge-tree reading
git merge-tree --write-tree origin/main HEADatorigin/main8b37a0973⇒ exit 0, tree8cc24592ed4ab2b5cebaf4f7350c2ab9373537fc, no conflict. No open PR carries either path(seat listing 03:39Z, unchanged at push time).
skip-changeset
Nothing published moves:
AGENTS.mdand.claude/**are on the fast track (repo-root instructionfile and the agent instruction tree), shipped in no package's
files[].验收备注
noted, not filed:the ledger's PR-body sanitizer rows (platform-readings.md296-299) say a PRbody's footer should carry NO leading rule line, because the trailing rule and the footer under it
are eaten together — while
AGENTS.md420-426 spells the block as blank line + rule + footer forevery surface. The two are about different mechanisms (sanitizer vs the footer writer), and this
card's scope is the channel/action sentence, so nothing here is changed for it. 承接者:the next
card on the byte-mutation paragraph — no PR or person is queued on it today.
维护者速读(草稿)
改了什么
AGENTS.md里关于「PR 正文署名页脚」的那句规则,不再预测平台会做什么,改为陈述它依赖什么:依赖通道(MCP 包装器 / 裸 REST)与动作(建 / 改),并要求「发你要存的页脚 + 每次写后回读」。
.claude/agents/os-dev.md的中文孪生句以同一 register 原地改写。两个文件行数都没变。为什么改
这句话四个月里被改过四次,每次都是把「上一次在某一个通道上测到的形态」写成无条件规律,
下一次换个通道就又被推翻。昨晚它第一次造成了真实损害:一位 agent 照该句字面去改 PR #16694 的正文,
在 REST 通道上得到了该文件明令禁止的重复页脚。改成「依赖 + 回读」之后,这句话不会再随平台行为腐烂,
而具体读数留在 pm-dispatch 的读数账本里 —— 账本本来就是放读数的地方。
风险与代价(含回滚)
风险很小:规则变宽(不再断言具体形态),不会让任何原本合规的写法变违规。代价是读者想知道
「我这个通道会发生什么」时要多跳一层到账本;这正是我们要的分工。回滚 = revert 这一个提交,
两个文件各恢复一句,无生成物、无下游依赖。
席位意见
(留空,待席位 ACCEPT 时填)
你要做的
这是受管面(
AGENTS.md+.claude/**),按 #9495 规矩需要人来合。请读上表两句的前后对照,确认新句子说的是你要的规矩;同意就合并(或批准后入队)。⛔ 席位不会翻 ready、不会入队。
Generated by Claude Code